
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * 网桥 exchange 这个英文名字不改了
 */
public class Exchange implements NetNode {


    public String name;//作为交换机的唯一标识
    public Map<String ,String[]>exchangeTable = new HashMap();//交换表，key:mac地址，value:[对应端口，时间]
    public ArrayList<NetNode> leftPortNodes;//左边端口 即"0"端口连接的设备
    public ArrayList<NetNode> rightPortNodes;//右边端口 即"1"端口连接的设备
    public String lNetSeg; //左网段
    public String rNetSeg; //右网段

    public ArrayList<NetNode> getLeftPortNodes() {
        return leftPortNodes;
    }

    public void setLeftPortNodes(ArrayList<NetNode> leftPortNodes) {
        this.leftPortNodes = leftPortNodes;
    }

    public ArrayList<NetNode> getRightPortNodes() {
        return rightPortNodes;
    }

    public void setRightPortNodes(ArrayList<NetNode> rightPortNodes) {
        this.rightPortNodes = rightPortNodes;
    }

    public String getlNetSeg() {
        return lNetSeg;
    }

    public void setlNetSeg(String lNetSeg) {
        this.lNetSeg = lNetSeg;
    }

    public String getrNetSeg() {
        return rNetSeg;
    }

    public void setrNetSeg(String rNetSeg) {
        this.rNetSeg = rNetSeg;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



    @Override
    public void transferFrame(NetNode inSide, String frame) {
        String[] s = frame.split(" ");
        String srcMac = s[0];
        String descMac = s[1];
        String data = s[2];
        //"0" 表示左端口 "1" 表示右端口 inPort = "0" 表示从"0"端口进入
        String inPort = "0";
        for (NetNode rNode : rightPortNodes) {
            if(inSide.getId().equals(rNode.getId())){
                //表示inSide这个网桥或者主机在右端口的设备中
                inPort = "1";
            }
        }
        //交换表中没有该帧源地址，无则加入，有则更新
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        String date = df.format(System.currentTimeMillis());
        exchangeTable.put(srcMac,new String[]{inPort,date});
        //判断交换表中是否有该帧目的地址
        if (!exchangeTable.containsKey(descMac)){
            //交换表中没有该帧目的地址，从另一个端口转发
            if (inPort.equals("0")){
                //表示数据从左边进入交换机，需要从右边端口转发
                for (NetNode rNode : rightPortNodes) {
                    rNode.transferFrame(this,frame);
                }
            }else {
                //表示数据从右边进入交换机，需要从左边端口转发
                for (NetNode lNode : leftPortNodes) {
                    lNode.transferFrame(this,frame);
                }
            }
        }else {
            //交换表中有该帧目的地址，且对应的接口就是进入接口 不做处理
            String[] s2 = exchangeTable.get(descMac);
            if(s2[0].equals(inPort)){
                return;
            }
            //交换表中有该帧目的地址，从对应端口转发 (其实就是从inPort不同的端口转发，可以用上面的代码，是一样的)
            String[] s3 = exchangeTable.get(descMac);
            if (s3[0].equals("0")){
                for (NetNode lNode : leftPortNodes) {
                    lNode.transferFrame(this,frame);
                }
            }else {
                for (NetNode rNode : rightPortNodes) {
                    rNode.transferFrame(this,frame);
                }
            }
        }
    }

    @Override
    public String getId() {
        return this.getName();
    }

}